/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.procesos;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Properties;
import org.ftp4che.FTPConnection;
import org.ftp4che.FTPConnectionFactory;
import org.ftp4che.exception.ConfigurationException;
import org.ftp4che.exception.FtpIOException;
import org.ftp4che.exception.FtpWorkflowException;
import org.ftp4che.util.ftpfile.FTPFile;
import pe.com.unidades.Archivo;

/**
 *
 * @author romulogalindo
 */
public class ProcesadorArchivoFTP extends Proceso {

    private Archivo archivo;
    private String server;
    private int port;
    private String user;
    private String pass;
    Properties pt;
    FTPConnection connection = null;
    private boolean ready = false;
    private String filename;
    private String fileformat;

    public ProcesadorArchivoFTP(String server, int port, String user, String pass, String fileName, String fileFormat) {
        this.server = server;
        this.port = port;
        this.user = user;
        this.pass = pass;
        this.filename = fileName;
        this.fileformat = fileFormat;
        //----------------------------------
        pt = new Properties();
        pt.setProperty("connection.host", server);
        pt.setProperty("connection.port", "" + port);
        pt.setProperty("user.login", user);
        pt.setProperty("user.password", pass);
        pt.setProperty("connection.type", "AUTH_SSL_FTP_CONNECTION");
        pt.setProperty("connection.timeout", "10000");
        pt.setProperty("connection.passive", "true");

        try {
            connection = FTPConnectionFactory.getInstance(pt);
            connection.connect();
            connection.noOperation();
            System.out.println("[Jaguar: ProcesadorArchivoFTP] Conectado al servidor ftp.");
        } catch (ConfigurationException | IOException | FtpIOException | FtpWorkflowException ep) {
            System.out.println("Error al momento de conectar al ftp");
        }
    }

    public ProcesadorArchivoFTP(Archivo archivo) {
        this.archivo = archivo;
    }

    public Archivo getArchivo() {
        return archivo;
    }

    public void setArchivo(Archivo archivo) {
        this.archivo = archivo;
    }

    public boolean isReady() {
        return ready;
    }

    public void setReady(boolean ready) {
        this.ready = ready;
    }

    public boolean procesar(Archivo archivo) {
        //UPLOAD FILE
        //---------------------------------------------------------
        Writer output = null;
        FTPFile ftp = null;
        File file = null;
        try {
            System.out.println("[Jaguar: ProcesadorArchivoFTP] Creando archivo coopac [" + archivo.getContenido().size() + " filas]");
            file = new File("file.fil");
            output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF8"));
            if (archivo.getContenido().size() > 0) {
                for (int i = 0; i < archivo.getContenido().size() - 1; i++) {
                    output.append(archivo.getContenido().get(i) + "\n");
                    break;
                }
                output.append(archivo.getContenido().get(archivo.getContenido().size() - 1));
            } else {
                output.append("");
            }
            output.close();
        } catch (IOException ep) {
            System.out.println("Error creando archivo :" + ep);
            return false;
        }
        ftp = new FTPFile(file);

        //-------------------ELIMANDO ARCHIVO PREVIO
        try {
            System.out.print("[Jaguar: ProcesadorArchivoFTP] Eliminando -> /files/" + filename + "." + fileformat);
            connection.deleteFile(new FTPFile(new File("/files/" + filename + "." + fileformat)));
            System.out.println("..\t[ok]");
        } catch (IOException | FtpIOException | FtpWorkflowException ep) {
            System.out.println("ep:" + ep.getMessage());
        }

        //============================
        try {
            System.out.print("[Jaguar: ProcesadorArchivoFTP] Subiendo ->/files/" + filename + "." + fileformat);
            connection.uploadFile(ftp, new FTPFile("/files/", filename + "." + fileformat), false);
            System.out.println("..\t[ok]");
            return true;
        } catch (IOException | FtpIOException | FtpWorkflowException ep) {
            System.out.println("ep:" + ep.getMessage());
            return false;
        }
//            return true;
    }

}
